package com.example.activity;

import android.content.Context;
import android.os.Bundle;

import com.example.utils.JsonParser;
import com.example.utils.ToastUtil;
import com.iflytek.cloud.InitListener;
import com.iflytek.cloud.RecognizerResult;
import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechError;
import com.iflytek.cloud.SpeechSynthesizer;
import com.iflytek.cloud.SpeechUtility;
import com.iflytek.cloud.SynthesizerListener;
import com.iflytek.cloud.ui.RecognizerDialog;
import com.iflytek.cloud.ui.RecognizerDialogListener;

import org.json.JSONException;
import org.json.JSONObject;

public class SpeechManager {

    private static SpeechManager instance;

    public static SpeechManager getInstance() {
        if (instance == null) {
            instance = new SpeechManager();
        }
        return instance;
    }

    private SpeechManager() {
    }

    public void init(Context context) {
        // 将“12345678”替换成您申请的 APPID，申请地址： http://www.xfyun.cn
        // 请勿在 “ =”与 appid 之间添加任务空字符或者转义符
        SpeechUtility.createUtility(context, SpeechConstant.APPID + "=5dc2cad4");
    }

    public void showSpeechDialog(final Context context, RecognizerDialogListener listener) {
        //1. 创建RecognizerDialog对象
        RecognizerDialog dialog = new RecognizerDialog(context, new InitListener() {
            @Override
            public void onInit(int i) {
                ToastUtil.show(context, "初始化对话框:" + i);
            }
        });
        //2. 设置accent、 language等参数
        dialog.setParameter(SpeechConstant.LANGUAGE, "zh_cn");// 设置中文
        dialog.setParameter(SpeechConstant.ACCENT, "mandarin");
        // 若要将UI控件用于语义理解，必须添加以下参数设置，设置之后 onResult回调返回将是语义理解
        // 结果
        // mDialog.setParameter("asr_sch", "1");
        // mDialog.setParameter("nlp_version", "2.0");
        //3.设置回调接口
        dialog.setListener(listener);
        //4. 显示dialog，接收语音输入
        dialog.show();
    }

    class MyRecognizerDialogListener implements RecognizerDialogListener {

        /**
         * @param results
         * @param isLast  是否说完了
         */
        @Override
        public void onResult(RecognizerResult results, boolean isLast) {
            String result = results.getResultString(); //为解析的
//            ToastUtil.show(result); ;
            System.out.println(" 没有解析的 :" + result);

            String text = JsonParser.parseIatResult(result);//解析过后的
            System.out.println(" 解析后的 :" + text);

            String sn = null;
            // 读取json结果中的 sn字段
            try {
                JSONObject resultJson = new JSONObject(results.getResultString());
                sn = resultJson.optString("sn");
            } catch (JSONException e) {
                e.printStackTrace();
            }

//            mIatResults.put(sn, text);//没有得到一句，添加到
//
//            StringBuffer resultBuffer = new StringBuffer();
//            for (String key : mIatResults.keySet()) {
//                resultBuffer.append(mIatResults.get(key));
//            }
//
//            et_input.setText(resultBuffer.toString());// 设置输入框的文本
//            et_input.setSelection(et_input.length());//把光标定位末尾
        }

        @Override
        public void onError(SpeechError speechError) {

        }
    }

    private void speekText(Context context, SynthesizerListener listener) {
        //1. 创建 SpeechSynthesizer 对象 , 第二个参数： 本地合成时传 InitListener
        SpeechSynthesizer mTts = SpeechSynthesizer.createSynthesizer(context, null);
//2.合成参数设置，详见《 MSC Reference Manual》 SpeechSynthesizer 类
//设置发音人（更多在线发音人，用户可参见 附录 13.2
        mTts.setParameter(SpeechConstant.VOICE_NAME, "vixyun"); // 设置发音人
        mTts.setParameter(SpeechConstant.SPEED, "50");// 设置语速
        mTts.setParameter(SpeechConstant.VOLUME, "80");// 设置音量，范围 0~100
        mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD); //设置云端
//设置合成音频保存位置（可自定义保存位置），保存在 “./sdcard/iflytek.pcm”
//保存在 SD 卡需要在 AndroidManifest.xml 添加写 SD 卡权限
//仅支持保存为 pcm 和 wav 格式， 如果不需要保存合成音频，注释该行代码
        mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, "./sdcard/iflytek.pcm");
//3.开始合成
        mTts.startSpeaking("科大讯飞,有东北音?", listener);
    }
}
